package cn.dglydrpy.study.j2ee.servlet.day13.annotation;

import java.lang.reflect.Method;
import java.util.Scanner;


/*
 * 利用反射动态调用方法,只执行含java注解"test"的方法
 */
public class ATest {
	public static void main(String[] args) throws Exception {
		Scanner scanner = new Scanner(System.in);
		System.out.println("输入完整包名.类名:");
		String className = scanner.nextLine().trim();

		Class cls = Class.forName(className);
		Object object = cls.newInstance();
		Method[] methods = cls.getDeclaredMethods();

		for (Method method : methods) {
			Class[] type = method.getParameterTypes(); //可以使用type.length来判断是否含参
			System.out.println(method.getName());//方法名
			//获取方法前的注解
			Test test = method.getDeclaredAnnotation(Test.class);
			if(test != null){
				if(type.length>0){//含参方法 
					//找符合特定条件的方法并精确赋参
					if("funyy6".equals(method.getName())){
						Object[] params = new Object[]{100,"hello"};
						String reslut =(String) method.invoke(object, params); //默认反射调用方法返回的结果是object
						System.out.println("方法返回值:"+reslut);		
					}else{//通过参数类型模糊赋参
						Object[] params = new Object[type.length];
						for(int i=0;i<params.length;i++){
							if(type[i]==int.class){
								params[i]=666;
							}
							if(type[i]==String.class){
								params[i]="world";
							}
						}
						System.out.println(method.invoke(object, params));
					}	
				}else{//无参的方法
					System.out.println(method.invoke(object));
				}
				String value = test.abc();
				System.out.println("注解的属性值: "+ value);
				System.out.println("===============================================");			
			}
			System.out.println("********************************************");	
		}
	}
}
